package org.mspring.search.engine;

import java.util.List;

import org.apache.lucene.search.Query;
import org.mspring.platform.dao.support.Page;
import org.mspring.search.Searchable;

/**
 * 索引引擎实现构建索引.删除索引.更新索引.检索等操作.
 *
 * @author Gao Youbo
 * @since 2013年8月2日
 */
@SuppressWarnings({"rawtypes"})
public interface SearchEngine {

    /**
     * 创建索引
     *
     * @param searchables
     * @throws Exception
     */
    public void doIndex(Searchable... searchables) throws Exception;

    /**
     * 创建索引(考虑线程安全)
     *
     * @param searchables 对象
     * @throws Exception
     */
    public void doIndex(List<? extends Searchable> searchables) throws Exception;

    /**
     * 删除索引
     *
     * @param bean 对象
     * @throws Exception
     */
    public void deleteIndex(Searchable... beans) throws Exception;

    /**
     * 删除索引(删除多个)
     *
     * @param beans 对象
     * @throws Exception
     */
    public void deleteIndexs(List<? extends Searchable> beans) throws Exception;

    /**
     * 更新索引
     *
     * @param searchables 需要更新的bean
     * @throws Exception
     */
    public void updateIndex(Searchable... searchables) throws Exception;

    /**
     * 批量更新索引
     *
     * @param searchables 需要更新的beans
     * @throws Exception
     */
    public void updateIndexs(List<? extends Searchable> searchables) throws Exception;

    /**
     * 索引优化
     *
     * @param clazz
     * @throws Exception
     */
    public void optimize(Class<? extends Searchable> clazz) throws Exception;

    /**
     * 进行检索
     *
     * @param clazz 检索对象
     * @param keyword 关键字
     * @param fields 检索字段
     * @param isHighlighter 是否高亮
     * @param page 分页参数
     * @return
     * @throws Exception
     */
    public Page doSearch(Class<? extends Searchable> clazz, String keyword, String[] fields, boolean isHighlighter, Page page) throws Exception;

    /**
     * 进行检索
     *
     * @param clazz 检索对象
     * @param query 查询对象
     * @param isHighlighter 是否高亮关键字
     * @param page 分页参数
     * @return
     * @throws Exception
     */
    public Page doSearch(Class<? extends Searchable> clazz, Query query, boolean isHighlighter, Page page) throws Exception;

    /**
     * 进行多个检索对象的检索
     *
     * @param clazz 多个检索对象
     * @param keyword 关键字
     * @param fields 检索字段
     * @param isHighlighter 是否高亮
     * @param page 分页参数
     * @return
     * @throws Exception
     */
    public Page doSearch(List<Class<? extends Searchable>> classes, String keyword, String[] fields, boolean isHighlighter, Page page) throws Exception;

    /**
     * 统计记录数量
     *
     * @param clazz
     * @param query
     * @return
     * @throws Exception
     */
    public Long count(Class<? extends Searchable> clazz, Query query) throws Exception;

    /**
     * 统计记录数量
     *
     * @param classes
     * @param keyword
     * @param fields
     * @return
     * @throws java.lang.Exception
     */
    public Long count(List<Class<? extends Searchable>> classes, String keyword, String[] fields) throws Exception;
}
